package Control;
import java.util.ArrayList;
import java.util.Random;

import Model.Entitas;
import Model.Hangya;
import Model.Hangyaboly;
import Model.Hangyaleso;
import Model.HangyaszSun;
import Model.Jatekter;
import Model.Kavics;
import Model.Majkonzerv;
import Model.Mezo;
import Model.Tocsa;
import View.IMegjelenito;

/**
 * 
 * A kontroller irányítja és fogja össze a komponenseket, ez valósítja meg a játékban levő objektumok szinkronizálását, vezérlését.
 * Ez felelős a megjelenítő értesítéséről, hogy mikor van a játéktér mintavételezhető állapotban.
 * Ez inicializálja a játékteret elhelyezi a megfelelő statikus entitásokat (például a hangyalesők, vagy az akadályok).
 * Az idő múlását ez az osztály tartja nyilván és vezérli a játékkörökkel.
 *
 */

public class Kontroller
{
	public static boolean veletlenEsemenyek;
	/** A játék kezdete óta eltelt játékkörök száma. */
	private int ido;
	
	/** A Kontrollerhez kapcsolt megjelenítő. */
	public IMegjelenito megjelenito;
	/** A Kontroller által felügyelt Játéktér. */
	public Jatekter jatekter;

	/**
	 * A Kontroller osztály paraméteres konstruktora.
	 * @param megjelenito A Kontrollerhez csatolni kívánt megjelenítő.
	 */
	public Kontroller(Jatekter jatekter, IMegjelenito megjelenito)
	{
		megjelenito.addKontroller(this);
		this.megjelenito = megjelenito;
		this.jatekter = jatekter;
		inicializal();
		jatekter.legkozelebbiKajaKitolto();
	}
	
	static
	{
		veletlenEsemenyek = true;
	}
	
	/**
	 * Időegységenként új játékkört indít.
	 */
	public void mindenkitLeptet()
	{
		ido++;
		jatekter.jatekkor();
		megjelenito.mintavetel();
	}
	
	public int getIdo()
	{
		return ido;
	}
	
	/**
	 * Elhelyez egy statikus Entitást a Játéktéren, úgy hogy ez ne sértse a lefektetett szabályokat.
	 * @param entitas Egy elhelyezendő Entitás objektum.
	 */
	public void statikusEntitasLerako(Entitas entitas)
	{
		ArrayList<Mezo> mezoLista = jatekter.getMezoLista();
		
		Random r = new Random();
		
		/*for(Mezo randomMezo : mezoLista)*/
		while(true){

			int random = r.nextInt(mezoLista.size());
			Mezo randomMezo = mezoLista.get(random);// random mezo
			
			boolean allEmpty = true;
			ArrayList<Mezo> szomszedok = randomMezo.getSzomszedok();
			
			if(!randomMezo.getEntitasok().isEmpty()){ // ha a kiválasztott random mező nem üres, akkor nem tehetünk rá
				allEmpty = false;
			}
			
			for(Mezo szomszed : szomszedok) // ha az összes szomszéd nem üres, kkor nem tehetünk rá
			{
				if(szomszed != null)
				{ 
					if(!szomszed.getEntitasok().isEmpty())
					{
						allEmpty = false;
					}
				}
				else{
					allEmpty = false;
				}
			}
			
			if(allEmpty) {
				entitas.iderak(randomMezo);
				return;
			}
		}
	}
	
	/**
	 * Inicializálja a Játékteret, hogy elkezdődhessen a játék.
	 */
	public void inicializal()
	{			
		
		/* 
		 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		 * !!!!!!!!!!!!!!!!!!! HA KAJAT RAKSZ LE ADD HOZZA A JATEKTER KAJALISTAJAHOZ addKaja(Kaja k)!!!!!!!!!!!!!!!!!!
		 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		 */
		// kavicsok lerakása
		int kavicsdarab = 25; // ENNYI DARAB KAVICS LESZ
		for (int i = 0; i < kavicsdarab; i++) {
			statikusEntitasLerako(new Kavics());
		}
		
		// tócsák lerakása
		int tocsadarab = 4; // ENNYI DARAB TOCSA LESZ
		for (int i = 0; i < tocsadarab; i++) {
			statikusEntitasLerako(new Tocsa());
		}
		
		// kaják lerakása
		int kajadarab = 2; // ENNYI DARAB KAJA LESZ
		for (int i = 0; i < kajadarab; i++) {
			Majkonzerv majkonzerv = new Majkonzerv();
			
			statikusEntitasLerako(majkonzerv);
			jatekter.addKaja(majkonzerv); // itt adom hozzá a külön listához, hogy a nagy komment mondja
		}
		
		// hangyalesők lerakása
		int hangyalesodarab = 5; // ennyi darab hangyaleső lesz
		for (int i = 0; i < hangyalesodarab; i++) {
			statikusEntitasLerako(new Hangyaleso());
		}
		
		// hangyaboly lerakása
		Hangyaboly hangyaboly = new Hangyaboly(jatekter);	// jatekter a nyilvántartója
		
		statikusEntitasLerako(hangyaboly);
		//jatekter.feliratkozas(hangyaboly); // hangyaboly feliratkozása -- NEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		
		// hangyászsün lerakása
		HangyaszSun hangyaszsun = new HangyaszSun(jatekter); // jatekter a nyilvántartója
		
		statikusEntitasLerako(hangyaszsun);
		//jatekter.feliratkozas(hangyaszsun); // hangyaszSun feliratkozása -- NEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		
		//TESZT
		
		 /* for (int i=0;i<jatekter.getMezoLista().size()-1;i++) {
			   for(int j = i+1;j<jatekter.getMezoLista().size();j++) {
				   // tehat minden nem azonos mezoparra
				   Mezo m1 = jatekter.getMezoLista().get(i);
				   Mezo m2 = jatekter.getMezoLista().get(j);
				   for (Entitas e1 : m1.getEntitasok()) {
					for(Entitas e2 : m2.getEntitasok()) {
						if(e1 == e2) System.out.println("BAZDMEG");
					}
				}
			   }
		  }*/
		
	}

}